Exemple de notebook avec C

Explications

Le kernel C n'est pas installé par défaut avec Jupyter.

Il faut installer jupyter-c-kernel

Exemples

In [2]:
#include <stdio.h>

int main(int argc, char* argv) {
    printf("\nHello world from C from Jupyter notebook!");
}
Hello world from C from Jupyter notebook!

Factorielle

Pour calculer la fonction $n! := 1 \times 2 \times \dots \times n$ ($n\in\mathbb{N}$), on peut penser à une solution récursive (qui coutera en espace mémoire à cause de la pile d'appel) et une solution impérative.

In [12]:
#include <stdio.h>
#define MAX_I 15

int factorielle_rec(int n) { 
    if (n <= 1) {
        return 1;
    }
    else {
        return n * factorielle_rec(n - 1);
    }
}

int factorielle_imp(int n) {
    int f = 1;
    for (int i = 1; i <= n; i++) {
        f = f * i;  /* f *= i aussi possible*/
    }
    return f;
}

int main(int argc, char* argv) {
    for (int i = 1; i <= MAX_I+2; i++) {
        printf("\n  factorielle_rec(%d) = %d et factorielle_imp(%d) = %d", i, factorielle_rec(i), i, factorielle_imp(i));
        if (i == MAX_I) {
            printf("\nValeurs fausses après %i", MAX_I);
        }
    }
}
  factorielle_rec(1) = 1
  factorielle_rec(2) = 2
  factorielle_rec(3) = 6
  factorielle_rec(4) = 24
  factorielle_rec(5) = 120
  factorielle_rec(6) = 720
  factorielle_rec(7) = 5040
  factorielle_rec(8) = 40320
  factorielle_rec(9) = 362880
  factorielle_rec(10) = 3628800
  factorielle_rec(11) = 39916800
  factorielle_rec(12) = 479001600
  factorielle_rec(13) = 1932053504
  factorielle_rec(14) = 1278945280
  factorielle_rec(15) = 2004310016
Valeurs fausses après 15
  factorielle_rec(16) = 2004189184
  factorielle_rec(17) = -288522240
In [ ]:

Comme on le voit, les valeurs deviennent fausses dès que $i\geq16$. On peut augmenter la précision en utilisant des long au lieu d'int, qui utilisent (sur ma machine) 64 bits au lieu de 32 bits.

Par contre, passer à des long long n'apporterait rien (sur ma machine).

In [43]:
#include <stdio.h>
#define MAX_I 20

long factorielle_rec(long n) { 
    if (n <= 1) {
        return 1;
    }
    else {
        return n * factorielle_rec(n - 1L);
    }
}

long factorielle_imp(long n) {
    long f = 1;
    for (int i = 1; i <= n; i++) {
        f = f * i;  /* f *= i aussi possible*/
    }
    return f;
}

int main(int argc, char* argv) {
    for (long i = 1; i <= MAX_I+2; i++) {
        printf("\n  factorielle_rec(%li) = %li et factorielle_imp(%li) = %li", i, factorielle_rec(i), i, factorielle_imp(i));
        if (i == MAX_I) {
            printf("\nValeurs fausses après %d", MAX_I);
        }
    }
}
  factorielle_rec(1) = 1 et factorielle_imp(1) = 1
  factorielle_rec(2) = 2 et factorielle_imp(2) = 2
  factorielle_rec(3) = 6 et factorielle_imp(3) = 6
  factorielle_rec(4) = 24 et factorielle_imp(4) = 24
  factorielle_rec(5) = 120 et factorielle_imp(5) = 120
  factorielle_rec(6) = 720 et factorielle_imp(6) = 720
  factorielle_rec(7) = 5040 et factorielle_imp(7) = 5040
  factorielle_rec(8) = 40320 et factorielle_imp(8) = 40320
  factorielle_rec(9) = 362880 et factorielle_imp(9) = 362880
  factorielle_rec(10) = 3628800 et factorielle_imp(10) = 3628800
  factorielle_rec(11) = 39916800 et factorielle_imp(11) = 39916800
  factorielle_rec(12) = 479001600 et factorielle_imp(12) = 479001600
  factorielle_rec(13) = 6227020800 et factorielle_imp(13) = 6227020800
  factorielle_rec(14) = 87178291200 et factorielle_imp(14) = 87178291200
  factorielle_rec(15) = 1307674368000 et factorielle_imp(15) = 1307674368000
  factorielle_rec(16) = 20922789888000 et factorielle_imp(16) = 20922789888000
  factorielle_rec(17) = 355687428096000 et factorielle_imp(17) = 355687428096000
  factorielle_rec(18) = 6402373705728000 et factorielle_imp(18) = 6402373705728000
  factorielle_rec(19) = 121645100408832000 et factorielle_imp(19) = 121645100408832000
  factorielle_rec(20) = 2432902008176640000 et factorielle_imp(20) = 2432902008176640000
Valeurs fausses après 20
  factorielle_rec(21) = -4249290049419214848 et factorielle_imp(21) = -4249290049419214848
  factorielle_rec(22) = -1250660718674968576 et factorielle_imp(22) = -1250660718674968576

D'autres exemples ?

TODO: plus tard !

Pour en apprendre plus